﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using EntidadesCompartidas;
using Logica;
using System.Web.Services;
using System.ServiceModel;


namespace Smart_House_System.Cliente
{
    public partial class visualizarplano : System.Web.UI.Page
    {
        private static Casa laCasa;
        private static Plano miPlano;
        private static Usuario _usuario = new Usuario();
        private static ServiceReference2.Service1Client myService = null;
        private static string respAnt = "";
        private static List<Casa> listCasas = new List<Casa>();
        private static ServiceReference2.Service1Client myService2 = null;


        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!Page.IsPostBack)
                {
                    laCasa = (Casa)Session["Casa"];
                    myService = new ServiceReference2.Service1Client();
                    myService.Endpoint.Address = new EndpointAddress(new Uri(laCasa.Servicio), myService.Endpoint.Address.Identity, myService.Endpoint.Address.Headers);
                    myService.Open();
                    myService.GetData(1);

                    myService2 = new ServiceReference2.Service1Client();
                    myService2.Endpoint.Address = new EndpointAddress(new Uri(laCasa.Servicio), myService2.Endpoint.Address.Identity, myService2.Endpoint.Address.Headers);
                    myService2.Open();
                    myService2.GetData(3);
                }
                if (!Page.IsPostBack)
                {
                    laCasa = (Casa)Session["Casa"];
                    List<Plano> planos = laCasa.Planos;
                    _usuario = (Usuario)Session["Usuario"];
                    cmbUsu.Items.Clear();


                    listCasas = FabricaLogica.getLogicaCasa().ListarCasas(_usuario);
                    if (listCasas == null || listCasas.Count == 0)
                    {
                        throw new Exception("Usuario no registrado.");
                    }
                    else
                    {
                        cmbCasas.Items.Clear();
                        foreach (Casa c1 in listCasas)
                        {
                            ListItem i2 = new ListItem("Casa " + c1.Id + " - " + c1.Direccion, c1.Id.ToString());
                            cmbCasas.Items.Add(i2);
                            lblCasa.Visible = true;
                            cmbCasas.Visible = true;
                        }
                        Casa miCasa = FabricaLogica.getLogicaCasa().BuscarCasa(listCasas[0].Id);
                        ListItem i4 = new ListItem("Seleccione Plano", "Seleccione Plano");
                        cmbUsu.Items.Add(i4);
                        foreach (Plano p1 in miCasa.Planos)
                        {
                            ListItem i3 = new ListItem("Plano " + p1.Idp.ToString(), p1.Foto + "@" + p1.Idp);
                            cmbUsu.Items.Add(i3);
                            cmbUsu.Visible = true;
                        }
                    }
                }
            }
            catch (EndpointNotFoundException ex2)
            {
                Response.Redirect("~/Cliente/ErrorCliente.aspx?Mensaje=" + ex2.Message);
            }
            catch (Exception ex)
            {
                Response.Redirect("~/Cliente/ErrorCliente.aspx?Mensaje=" + ex.Message);
                lblMensaje.ForeColor = System.Drawing.Color.Red;
                lblMensaje.Text = ex.Message;
            }
        }

        public static void estadosSensores()
        {
            try
            {
                string p = myService2.GetResponseAlarmSens();
                if (p != "" && respAnt != p)
                {
                    string[] caracters = p.Split(':');
                    int i = 0;
                    foreach (string caract in caracters)
                    {
                        i++;
                        if (caract != "")
                        {
                            if (i == 2)
                            {
                                if (miPlano != null)
                                {
                                    foreach (Sensor s in miPlano.Sensores)
                                    {
                                        if (s.Id == int.Parse(caracters[0]))
                                        {
                                            if (caracters[1].ToString() == "True")
                                            {
                                                s.Estado = true;
                                            }
                                            else
                                            {
                                                s.Estado = false;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    respAnt = p;
                }
            }
            catch (Exception ex)
            {
                HttpContext.Current.Response.Redirect("~/Cliente/ErrorCliente.aspx?Mensaje=" + ex.Message);
            }
        }

        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string getSensorStatus()
        {
            estadosSensores();

            string listaObjs = "";
            int i = 0;
            if (miPlano != null)
            {
                foreach (Sensor s in miPlano.Sensores)
                {
                    i++;
                    if (i < miPlano.Sensores.Count())
                    {
                        listaObjs += "sensor" + s.Id + ":" + s.Estado + "-";
                    }
                    else
                    {
                        listaObjs += "sensor" + s.Id + ":" + s.Estado;
                    }
                }
            }
            return listaObjs; // Retorna una cadena conteniendo los elementos configurados
        }


        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string getObjects(string message)
        {
            try
            {
                int myIdP = int.Parse(message.Substring(6, 1));
                miPlano = new Plano();
                miPlano.Idp = myIdP;
                Plano auxPlano = FabricaLogica.getLogicaPlano().BuscarPlano(miPlano.Idp);
                if (miPlano != null && miPlano.Idp > 0)
                {
                    if (auxPlano == null)
                    {
                        auxPlano = new Plano();
                    }
                    if (miPlano.Camaras.Count == 0)
                    {
                        miPlano.Camaras = auxPlano.Camaras;
                    }
                    else
                    {
                        auxPlano.Camaras = miPlano.Camaras;
                    }
                    if (miPlano.Luces.Count == 0)
                    {
                        miPlano.Luces = auxPlano.Luces;
                    }
                    else
                    {
                        auxPlano.Luces = miPlano.Luces;
                    }
                    if (miPlano.Sensores.Count == 0)
                    {
                        miPlano.Sensores = auxPlano.Sensores;
                    }
                    else
                    {
                        auxPlano.Sensores = miPlano.Sensores;
                    }
                }
                string listaObjs = "";
                if (_usuario.ElRol == RolUsuario.habPrincipal)
                {
                    foreach (Camara c in miPlano.Camaras)
                    {
                        listaObjs += "1" + "_" + c.DirRtsp + "_" + c.Ejey + "_" + c.Ejex + "-";
                    }
                }
                if (auxPlano.Luces.Count > 0)
                {
                    foreach (Luz l in miPlano.Luces)
                    {
                        listaObjs += "2" + "_" + l.Id + "_" + l.Ejey + "_" + l.Ejex + "-";
                    }
                }
                if (miPlano.Sensores.Count > 0 && (_usuario.ElRol != RolUsuario.habTerciario))
                {
                    foreach (Sensor s in miPlano.Sensores)
                    {
                        listaObjs += "3" + "_" + s.Id + "_" + s.Ejey + "_" + s.Ejex + "-";
                    }
                }
                return listaObjs; // Retorna una cadena conteniendo los elementos configurados
            }
            catch (Exception ex)
            {
                return " ";
            }
        }


        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string sendRequest(string message)
        {
            try
            {
                if (message != "" && message != null)
                {
                    string objClicked = message;

                    if (objClicked.Substring(0, 4) == "lamp")
                    {
                        int n = int.Parse(objClicked.Substring(4, 1));
                        string nn = "";
                        if (n < 10) { nn = "0" + n.ToString(); }
                        int n2 = n + 2;
                        string envio = "AC " + nn + " 02 " + "0" + n2.ToString();
                        myService.SetRequest(envio);
                    }
                }
                else
                {
                    throw new Exception("Error 22321. Contactese con el Administrador.");
                }
                return "";
            }
            catch (Exception ex)
            {
                return "";
            }
        }

        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string sendRequestAsk(string message)
        {
            try
            {
                if (message != "" && message != null)
                {
                    string objClicked = message;

                    if (objClicked.Substring(0, 4) == "lamp")
                    {
                        int n = int.Parse(objClicked.Substring(4, 1));
                        string nn = "";
                        if (n < 10) { nn = "0" + n.ToString(); }
                        int n2 = n + 1;
                        string envio = "AC " + nn + " 01 " + "0" + n2.ToString();
                        myService.SetRequest(envio);
                    }
                }
                else
                {
                    throw new Exception("Error 22321. Contactese con el Administrador.");
                }
                return "";
            }
            catch (Exception ex)
            {
                return "";
            }
        }

        [WebMethod] // Atributo necesario para trabajar con servicios Webs 
        public static string getLuzStatus(string message)
        {
            try
            {
                if (message != "999")
                {
                    string aa = message.Substring(4, message.Length - 4);
                    int id = int.Parse(aa);
                    string vuelta = "";
                    string estadoluz = myService.GetResponse();
                    if (estadoluz != "" && estadoluz.Substring(0, 2) == "3f")
                    {
                        string est = estadoluz.Substring(5, 2);
                        int estado = int.Parse(est.Trim());
                        string d = "";
                        if (estado == 0)
                        {
                            d = "False";
                        }
                        else
                        {
                            d = "True";
                        }
                        vuelta = id + ":" + d;
                    }
                    return vuelta;
                }
                else
                {
                    return "";
                }
            }
            catch (CommunicationObjectFaultedException ex)
            {
                HttpContext.Current.Response.Redirect("~/Cliente/ErrorCliente.aspx?Mensaje=Timepo de espera inactivo superado.");
                return "";
            }
        }

        protected void btnAux3_Click(object sender, EventArgs e)
        {
            try
            {
                cmbUsu.Items.Clear();
                ListItem i = new ListItem("Seleccione Plano", "Seleccione Plano");
                cmbUsu.Items.Add(i);
                Casa miCasa = FabricaLogica.getLogicaCasa().BuscarCasa(listCasas[cmbCasas.SelectedIndex].Id);
                foreach (Plano p1 in miCasa.Planos)
                {
                    ListItem i3 = new ListItem("Plano " + p1.Idp.ToString(), p1.Foto + "@" + p1.Idp);
                    cmbUsu.Items.Add(i3);
                    cmbUsu.Visible = true;
                }
            }
            catch (Exception ex)
            {
                lblMensaje.ForeColor = System.Drawing.Color.Red;
                lblMensaje.Text = ex.Message;
            }
        }

        protected void btnAux2_Click(object sender, EventArgs e)
        {
            if (cmbUsu.SelectedIndex > 0)
            {
                ListItem i = cmbUsu.Items[cmbUsu.SelectedIndex];
                string[] misKeys = i.Value.Split('@');
                int i2 = 0;
                string keyO = "";
                foreach (string key in misKeys)
                {
                    i2++;
                    if (i2 == 1)
                    {
                        keyO = key;

                    }
                }
                imgPlano.Attributes["src"] = keyO;
            }
        }
    }
}
